
/**
 * @author seeker910
 * @description redjs javascript sdk :appjs
 * @description redjs javascript 客户端应用程序，在redjs框架中，将每个html页面定义一个application;通过启动application 来使用redjs框架的组建和服务
 */
(function () {
    var appId = "";
    var appAuth = "";
    if (document.currentScript) {
        appId = document.currentScript.getAttribute("appId");
        appAuth = document.currentScript.getAttribute("appAuth"); 
        document.cookie = "Authorization=" + appAuth; 
    }

    if (!(Rsd && Rsd.createApplication)) {
        return;
    }
    
    /**
     * 创建应用程序
     */
    var app = Rsd.createApplication({
        //
        appId: appId,
        authorization: appAuth,
        debug: true,
        apiHosts: [], 
        sessionErrorCodes:['W2110','W2112'],
        /**
         * 
         */
        beforeRun: function beforeRun() {

            var _token = _token = Rsd.getCookie(Rsd.tokenName || "token");
            if (Rsd.isEmpty(_token)) {
                _token = Rsd.getUrlParam("token");
            }
            if (Rsd.isEmpty(_token)) {
                _token = Rsd.getUrlParam('____key');
            }
            if (_token) {
                this.appToken = _token;
            }
        },
        /**
         * 
         */
        launch: function launch() {

            var me = this;
            var _hosts = this.apiHosts;
            var _length = 0;
            var _count = 0;
            for (var i in _hosts) {

                if (_hosts[i].isLoaded) {
                    continue;
                }
                _length++;
            }

            //加载service路由表
            Rsd.loadRouteTable([], function () {
                _count++;
                me.isReady = _length == _count;
            });

            //console.log(Date.now(),'Redjs application has started.');

            //获取页面 main 或者 setup 方法
            var _fn = window.main || window.setup;
            if (_fn) {
                try
                {
                    _fn.call(me);
                }
                catch(err)
                {
                    alert(err.message||'应用执行异常');
                } 
                return;
            }
            alert('can not found main function in window object.');
        },

        /***
         * 
         */
        failureHandler: function failureHandler(data) {
            var app = this;

            if(Rsd.edition === 'all' && sessionErrorCodes.indexOf(data.code) >=0 )//身份验证失败
            {
                if (Rsd.isEmpty(app.checkSessionServiceName)) {
                    Rsd.alert('配置错误','未设置属性checkSessionServiceName');
                    return;
                }
                if (!app.loginDialog) {

                    app.loginDialog = Rsd.create('Rsd.tool.LoginDialog', {
                        beforeClose: function () {
                            app.loginDialog = null;
                        },
                        checkSessionServiceName: app.checkSessionServiceName
                    });
                }
                app.loginDialog.showDialog();

                return false;
            }
            
            //
            //this.printCallStack('appliacation'); 

            if (!data.success) {
                //默认错误提示
                var title = data.msg;
                var msg = "";
                var arr = title.split('|');
                if(arr.length> 1)
                {
                    title = arr[0];
                    msg = data.msg.substr(title.length+1);
                }
                Rsd.alert(title || '操作失败',msg);
            }
            return false;

        },

        /***
         * 
         */
        emptyHandler: function emptyHandler(data) {
            //
            //console.log('log in emptyHandler',data);
        },
        /**
         * 
         */
        errorHandler: function errorHandler(xhr, evt) {
            console.trace('http request error:', xhr, evt);
        }


    });

    // 追加 扩展服务
    /**
     * @description 请求 服务
     */
    app.http = function http(serviceName,data)
    {
        return Rsd.$request(serviceName,data);
    },
    /**
     * @description 加载js文件
     * @param {*} url 
     * @param {*} callback 
     */
    app.js = function js(url, callback) {
        Rsd.loadScriptFile(url, callback);
    }
    /**
     * @description 加载css文件
     * @param {*} url 
     * @param {*} callback 
     */
    app.css = function css(url, callback) {
        Rsd.loadCssFile(url, callback);
    }

    /****** 多种页面提交 方式 *****/

    /**
     * 方式1:指定表单对象=》提交到form action 指定接口(ServiceName) =》callback处理 或 根据返回returnUrl 跳转页面 
     * @param {*} serviceName 服务名称
     * @param {*} data 数据
     * @param {*} callback 回调
     * @returns 
     */
    app.submitData = function submitData(serviceName, data, callback) {
         
            try {
                 
                Rsd.app.requestService(serviceName, data, function (resp) {

                    if (callback) {
                        if (callback(resp) === false)//返回 false 表示终止后续代码执行
                        {
                            return;
                        }
                    }
                    if (resp.success) {
                        if (resp.data.returnUrl) {
                            window.location.href = resp.data.returnUrl;
                        }
                    }
                    else { 
                        //requestService 有默认提示
                        //alert(resp.msg || 'Data submit failed');
                        console.log('callback不存在或未阻止',resp);
                    }
                });

            } catch (ex) {
                console.error(ex);
            };

        

        return true;
    };

    /**
     * 方式1:为form的submit事件,在submit事件 中调用该方法，提交form ,禁止跳转页面；提交到form action 指定接口(ServiceName);callback处理 或 根据返回returnUrl 跳转页面
     * @description 将该方法 注册 为form的asubmit事件,提交form ,并根据返回的returnUrl值，跳转页面,
     * @param {*} evt 
     * @param {*} callback 回调
     * @returns 
     */
    app.submitForm = function submitForm(serviceName,form,callback) {

        var data = {};
        try { 
            var formData = new FormData(form);
           
            formData.forEach(function (value, key) { data[key] = value }); 

        } catch (ex) {
            console.error(ex);
        }; 
        app.submitData(serviceName,data,callback);
        return true;
    };
 
    /**
     * 模板相关 ,将所有模板相关方法，归类到Rsd.common.Template对象中
     */
    app.tpl = Rsd.create('Rsd.common.Template',{});
    //
    window.$app = app;
    
})();
//console.log(Date.now(),'app.js loaded');
